﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Dynamic;
using AutomationTools.Procedimentos.Exceptions;

namespace AutomationTools.Procedimentos.Iteracao
{
    /// <summary>
    /// Executa determinados procedimentos para o primeiro item do parametro.
    /// Recebe:     IEnumerable - A lista de objetos contendo mais de um item.
    /// Retorna:    object - Retorna o retorno do procedimento executado para o primeiro item do parametro.
    /// </summary>
    public class Primeiro : IProcedimento
    {
        public IProcedimento[] Procedimento { get; set; }

        /// <summary>
        /// Executa determinados procedimentos para o primeiro item do parametro.
        /// </summary>
        /// <param name="procedimento">Procedimentos a serem executados para o primeiro item do parametro.</param>
        public Primeiro(params IProcedimento[] procedimento)
        {
            Procedimento = procedimento;
        }
        
        public object Executar(IContexto contexto)
        {
            ValidarEntrada(contexto);

            List<object> ret = new List<object>();
            foreach (var item in (IEnumerable)contexto.Parametro)
            {
                contexto.Parametro = item;
                foreach (var proc in Procedimento)
                {
                    contexto.Parametro = proc.Executar(contexto);
                }
                return contexto.Parametro;
            }
            throw new Exception("Lista vazia");
        }


        public void ValidarEntrada(IContexto contexto)
        {
            if (!(contexto.Parametro is IEnumerable))
                throw new ParametroException(typeof(IEnumerable), contexto.Parametro.GetType());
        }
    }
}
